Complémentarité :
L’analyse factorielle met en évidence des structures. Toutefois, les analyses factorielles conduisent à :
L’analyse de classification cherche à partitionner l’ensemble des individus statistiques élémentaires à partir de l’ensemble des variables ou des facteurs les plus significatifs d’une analyse factorielle :
On peut utiliser une méthode de classification sur les facteurs résultant d’une ACP.
Deux grands types
C’est une méthode hiérarchique
Bisson, G., 2011
Bisson, G., 2011
On utilise des mesures :
En géographie, plutôt des mesures de dissimilarité. Ex :
5 méthodes principales :
single linkage) : La distance entre deux classes est définie par la plus courte distance séparant un individu d’une classe et un individu d’une autre classe
complete linkage): La distance entre deux classes est définie par la plus grande distance séparant un individu d’une classe et un individu d’une autre classe
average) dans les classes : La distance entre deux classes est définie en calculant la distance moyenne entre tous les éléments de chaque classe
centroid) : La distance entre deux classes est définie comme étant la distance séparant les centres de gravité des deux classes
ward.D2) : Elle consiste à réunir les deux classes dont le regroupement fera le moins baisser l’inertie inter-classe. Cette technique tend à regrouper ensemble les petites classes
ElementR, p. 124
ElementR, p. 128
ElementR, p. 130 (Si l’on choisit de conserver 5 classes, la partition se fera sur la ligne orange)
ElementR, p. 132
ElementR, p. 133
library(dplyr)
library(ggplot2)
library(scales)
library(tidyr)
library(cluster)
library(ade4) # Calcul de distances aux Khi2
library(FactoClass) # CAH Khi2cluster::agnesdonneesExemple <- iris %>% select(-Species)
cahAgnes <- agnes(x = donneesExemple, metric = "euclidean", method = "ward")niveaux <- sort(cahAgnes$height, decreasing = TRUE)
niveauxRelatifs <- niveaux/sum(niveaux)
niveauxCumules <- cumsum(niveauxRelatifs)
dfNiveaux <- data_frame(Poids = niveaux, Inertie = niveauxRelatifs, CumInertie = niveauxCumules,
Partition = 1:length(niveaux))ggplot(dfNiveaux %>% filter(Inertie > 0.01)) + geom_bar(aes(Partition, Inertie),
stat = "identity", position = "dodge") + scale_y_continuous(name = "Part de \nl'inertie totale",
labels = percent)ggplot(dfNiveaux %>% filter(Inertie > 0.01)) + geom_bar(aes(Partition, CumInertie),
stat = "identity", position = "dodge") + scale_y_continuous(name = "Part cumulée de\n l'inertie totale",
labels = percent)dendrogramdendroBase <- as.dendrogram(cahAgnes)
plot(dendroBase, leaflab = "none")L’analyse des derniers graphiques permet de constater qu’une partition en 3 classes semblerait adaptée ici.
# Découpe
classesAgnes <- cutree(cahAgnes, k = 3)
# Chargement de fonctions de représentations plus avancées
source("A2Rplots.R")
ordreClasses <- unique(classesAgnes[cahAgnes$order])
cPal <- c(1:3)[ordreClasses]
A2Rplot(x = as.hclust(cahAgnes), k = 3, boxes = FALSE, col.up = "gray50", col.down = cPal,
show.labels = FALSE, main = "Dendrogramme")# On joint l'information des classes aux données initiales
donneesExemple$Classe <- classesAgnes
# Calcul des indicateurs moyens par classe
indicateursClasses <- donneesExemple %>% group_by(Classe) %>% summarise_each(funs = "mean")
str(indicateursClasses)Classes 'tbl_df', 'tbl' and 'data.frame': 3 obs. of 5 variables:
$ Classe : int 1 2 3
$ Sepal.Length: num 5.01 5.92 6.87
$ Sepal.Width : num 3.43 2.75 3.09
$ Petal.Length: num 1.46 4.42 5.77
$ Petal.Width : num 0.246 1.434 2.106
# Conversion au format long pour ggplot
indicateursClassesLong <- indicateursClasses %>% gather(key = Variable, value = Valeur,
-Classe) %>% mutate(Classe = factor(Classe))ggplot(indicateursClassesLong) + geom_bar(aes(Variable, Valeur, fill = Classe),
stat = "identity", position = "dodge") + facet_wrap(~Classe) + coord_flip() +
theme_minimal()indicateursClassesCentres <- donneesExemple %>%
mutate_each(funs(scale(., center = TRUE,scale = FALSE)), -Classe) %>% # Standardisation des résultats
group_by(Classe) %>%
summarise_each(funs = "mean") %>%
gather(key = Variable, value = Valeur, -Classe) %>%
mutate(Classe = factor(Classe))ggplot(indicateursClassesCentres) + geom_bar(aes(Variable, Valeur, fill = Classe),
stat = "identity", position = "dodge") + facet_wrap(~Classe) + coord_flip() +
theme_minimal()indicateursClassesStd <- donneesExemple %>%
mutate_each(funs("scale"), -Classe) %>% # Standardisation des résultats
group_by(Classe) %>%
summarise_each(funs = "mean") %>%
gather(key = Variable, value = Valeur, -Classe) %>%
mutate(Classe = factor(Classe))ggplot(indicateursClassesStd) + geom_bar(aes(Variable, Valeur, fill = Classe),
stat = "identity", position = "dodge") + facet_wrap(~Classe) + coord_flip() +
theme_minimal()On utilise le package ade4 pour calculer cette distance, qu’on obtient en réalisant une AFC sur les variables
library(ade4)
AFC <- dudi.coa(df = donneesExemple, scannf = FALSE, nf = ncol(donneesExemple))
distMat <- dist.dudi(AFC, amongrow = TRUE)Avec cette matrice de distance, on peut alors réaliser une CAH. On utilisera le package FactoClass car il permet la ré-injection des poids des individus perdus suite au passage au Khi2
library(FactoClass)
CAH <- ward.cluster(distMat, peso = apply(X = donneesExemple, MARGIN = 1, FUN = sum),
plots = TRUE, h.clust = 1)Graphiques descriptif
niveaux <- sort(CAH$height, decreasing = TRUE)
niveauxRelatifs <- niveaux/sum(niveaux)
niveauxCumules <- cumsum(niveauxRelatifs)
dfNiveaux <- data_frame(Poids = niveaux, Inertie = niveauxRelatifs, CumInertie = niveauxCumules,
Partition = 1:length(niveaux))par(mfrow = c(1, 3))
plot(as.dendrogram(CAH), leaflab = "none")
ggplot(dfNiveaux %>% filter(Inertie > 0.01)) + geom_bar(aes(Partition, Inertie),
stat = "identity", position = "dodge") + scale_y_continuous(name = "Part de \nl'inertie totale",
labels = percent)
ggplot(dfNiveaux %>% filter(Inertie > 0.01)) + geom_bar(aes(Partition, CumInertie),
stat = "identity", position = "dodge") + scale_y_continuous(name = "Part cumulée de\n l'inertie totale",
labels = percent)Découpe en 3 classes
donneesExemple$Classe <- cutree(tree = CAH, k = 3)
par(mfrow = c(1, 2))
plot.dudi(AFC, Tcol = TRUE, Trow = FALSE)
s.class(cstar = 1, addaxes = TRUE, grid = FALSE, axesell = TRUE, dfxy = AFC$li,
fac = as.factor(donneesExemple$Classe), col = 1:3, label = c(1:3), csub = 1.2,
possub = "bottomright", add = TRUE)ordreClasses <- unique(donneesExemple$Classe[CAH$order])
CAH$height <- sqrt(CAH$height)
A2Rplot(x = CAH, k = 3, boxes = FALSE, col.up = "gray50", col.down = c(1:3)[ordreClasses],
show.labels = FALSE, main = "Dendrogramme")tabSocial, qui contient des variables sociales structurelles sur votre aire d’étude.library(cartography)
tabSocial$txPROPRIETAIRES_rec <- cut(tabSocial$txPROPRIETAIRES, include.lowest = FALSE,
right = TRUE, breaks = c(0.33544721102942, 0.676843073439932, 0.806862170087977,
1), labels = c("Peu de propriétaires", "Classe mixte", "Beaucoup de propriétaires"))
typoLayer(spdf = toulCom, df = tabSocial, spdfid = "INSEE_COM", dfid = "COMMUNE",
var = "txPROPRIETAIRES_rec")http://www.youscribe.com/catalogue/rapports-et-theses/savoirs/techniques/evaluation-categorisation-217204